package com.example;

public class Animal {

    // private 私有属性 只能在类内部访问 将对象的状态（字段）私有化，通过公共方法访问 => 封装性 example:getName() 通过getName()方法访问name字段
    // public 公有属性 可以在类外部访问
    // protected 受保护属性 可以在类内部和子类访问
    // default 默认属性 只能在类内部访问
    private String name;
    private int age;
    private String color;
    public int num = 1;

    // 静态属性 属于类 不属于对象 所有对象共享
    // 属于类而非实例：静态变量被类的所有实例所共享。也就是说无论创建多少个该类的对象静态变量都只有一份副本存在于内存中
    // 内存分配：静态变量在类加载时就会被分配内存且在程序的整个生命周期内都存在
    // 访问方式:既可以通过类名直接访问，也能通过类的实例来访问，但推荐使用类名访问，这样能让代码更清晰。
    public static int count = 0;

    // 构造方法 用于初始化对象 每个类都有一个默认的构造方法 如果类中没有定义构造方法 则系统会自动生成一个默认的构造方法
    // 如果类中定义了构造方法 则系统不会自动生成默认的构造方法
    // 构造方法可以重载 可以有多个构造方法 但是参数列表不同
    public Animal(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

    public void makeSound() {
        System.out.println("Animal is making sound");
    }

    public void eat() {
        System.out.println("Animal is eating");
    }

    public void sleep() {
        System.out.println("Animal is sleeping");
    }

    public String getName() {
        System.out.println("getName" + '\t' + name);
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getColor() {
        return color;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public void countAdd() {
        count++;
        System.out.println("countAdd" + '\t' + count);
    }

    public void numAdd() {
        num++;
        System.out.println("numAdd" + '\t' + num);
    }
}
